Thermal management in modern computing devices is typically performed at the hardware level on a component-by-component basis. Components, such as central processing units (CPUs) and graphics processing units (GPUs), are provided with sensors that detect component temperature and logic that determines when the component is overheated and responds by throttling the performance of the component. For example, if a CPU runs hot, thermal management logic for the CPU may reduce the CPU frequency. Thermal management at the hardware level can prevent devices from overheating and failing. If hardware performance is throttled below the minimum requirements of the software executing on the device, however, the device may crash.